Amazon SageMaker HyperPod クラスター設定ファイルのバリデーションスクリプトを試してみた

Amazon SageMaker HyperPod クラスター設定ファイルのバリデーションスクリプトを試してみた

Clock Icon2025.01.03

Amazon SageMaker HyperPod クラスター作成時の設定項目は地味に多いです。本記事では、AWS CLI でクラスターを作成する前に設定ファイルの妥当性を確認できるのか試してみた結果を紹介します。

確認結果

バリデーションスクリプトは、主に JSON フォーマットの構文チェックとリソースの存在確認に限定されます。サービスクォータやリソース名の重複チェックには対応していないため、これらは別途確認が必要です。

https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-lifecycle-best-practices-slurm-validate-json-files.html

HyperPod クラスターの作成方法

AWS CLI で HyperPod クラスターを作成するには、aws sagemaker create-clusterコマンドを使用します。設定項目が多いため、JSON ファイルに設定値をまとめて指定することが多いです。

$ aws sagemaker create-cluster --cli-input-json file://cluster-config.json
cluster-config.json
{
    "ClusterName": "ml-cluster2",
    "InstanceGroups": [{
    "InstanceGroupName": "controller-machine",
    "InstanceType": "ml.m5.large",
    "InstanceStorageConfigs": [
        {
            "EbsVolumeConfig": {
                "VolumeSizeInGB": 500
            }
        }
    ],
    "InstanceCount": 1,
    "LifeCycleConfig": {
        "SourceS3Uri": "s3://sagemaker-lifecycle-19d62df0/src",
        "OnCreate": "on_create.sh"
    },
    "ExecutionRole": "arn:aws:iam::123456789012:role/sagemaker-hyperpod-AmazonSagemakerClusterExecutionR-xRAkhBpoaAD3",
    "ThreadsPerCore": 2
},
    {
        "InstanceGroupName": "worker-group-1",
        "InstanceType": "ml.g6.2xlarge",
        "InstanceCount": 2,
        "InstanceStorageConfigs": [
            {
                "EbsVolumeConfig": {
                    "VolumeSizeInGB": 500
                }
            }
        ],
        "LifeCycleConfig": {
            "SourceS3Uri": "s3://sagemaker-lifecycle-19d62df0/src",
            "OnCreate": "on_create.sh"
        },
        "ExecutionRole": "arn:aws:iam::123456789012:role/sagemaker-hyperpod-AmazonSagemakerClusterExecutionR-xRAkhBpoaAD3",
        "ThreadsPerCore": 1
    }],
    "VpcConfig": {
    "SecurityGroupIds": ["sg-0aabfa92fa251d1eb"],
    "Subnets":["subnet-0f3af7d4be4d8cb3c"]
    }
}

引数として渡す JSON ファイルの設定値が有効かクラスター作成コマンドを実行する前に確認したいです。

コンフィグファイルをチェックするには

クラスター作成コマンドには、ドライランのようなオプションは実装されていません。

$ aws sagemaker create-cluster --cli-input-json file://cluster-config.json

代わりにバリデーション用のスクリプトが用意されています。 こちらのスクリプトを試してみます。

https://github.com/aws-samples/awsome-distributed-training/blob/main/1.architectures/5.sagemaker-hyperpod/validate-config.py

ドキュメントに利用方法が簡単に紹介されています。

https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-lifecycle-best-practices-slurm-validate-json-files.html

準備

validate-config.pyファイルをダウンロードします。

curl -O https://raw.githubusercontent.com/aws-samples/awsome-distributed-training/main/1.architectures/5.sagemaker-hyperpod/validate-config.py

準備完了です。所要時間は約 15 秒です。

$ ll validate-config.py
-rw-r--r--@ 1 ohmura.yasutaka  staff   8.2K  1  3 08:16 validate-config.py

使い方

以下の 2 つの引数が必須です。パラメータ指定のファイルが曲者です。

  • --cluster-configに設定を書いた JSON ファイルを指定
  • --provisioning-parametersにパラメータ値を書いた JSON ファイルを指定
$ python3 validate-config.py --cluster-config cluster-config.json --provisioning-parameters provisioning_parameters.json
✔️  Validated instance group name worker-group-1 is correct ...
✔️  Validated subnet subnet-0f3af7d4be4d8cb3c ...
✔️  Validated security group sg-0aabfa92fa251d1eb ingress rules ...
✔️  Validated security group sg-0aabfa92fa251d1eb egress rules ...
✔️  Validated FSx Lustre DNS name fs-0429c318db14542bd.fsx.us-east-1.amazonaws.com ...
✔️  Validated FSx Lustre mount name s4ryjb4v ...
✔️  Validated provisioning_parameter.json is valid json ...
✅ Cluster Validation succeeded

パラメータ指定の JSON ファイルとは

設定項目の JSON ファイルの他にパラメータを記載した JSON ファイルが必要でした。設定項目で指定した値と同じ値をパラメータとして切り出してファイルにしないといけません。

provisioning_parameters.json
{
    "version": "1.0.0",
    "workload_manager": "slurm",
    "controller_group": "controller-machine",
    "worker_groups": [
    {
        "instance_group_name": "worker-group-1",
        "partition_name": "ml.trn1.32xlarge"
    }
],
    "fsx_dns_name": "fs-0429c318db14542bd.fsx.us-east-1.amazonaws.com",
    "fsx_mountname": "s4ryjb4v"
}

非常に手間ですが、引数として必要です。

バリデーション結果集

クラスター作成時に発生する可能性がある主なエラーケースを紹介します。実際に私がクラスター作成時に出くわしたものがほとんどです。

JSON ファイルのフォーマットに誤りがある場合

コンフィグファイルのバリデーションなので正しく機能しました。

コマンド 結果
validate-config.py ✅ エラー表示
aws sagemaker create-cluster ✅ エラー表示
$ python3 validate-config.py --cluster-config cluster-config-add-trn1.json --provisioning-parameters provisioning_parameters.json
❌ cluster-config.json is invalid.
$ aws sagemaker create-cluster --cli-input-json file://cluster-config-add-trn1.json

Error parsing parameter 'cli-input-json': Invalid JSON received.

存在しないインスタンスタイプを指定した場合

架空のインスタンスタイプを指定したコンフィグの場合は、aws sagemaker create-clusterコマンドの結果の方がわかりやすかったです。

コマンド 結果
validate-config.py 実行に失敗
aws sagemaker create-cluster ✅ エラー表示
$ python3 validate-config.py --cluster-config cluster-config.json --provisioning-parameters provisioning_parameters.json
✔️  Validated instance group name worker-group-1 is correct ...
Traceback (most recent call last):
  File "/home/cloudshell-user/awsome-distributed-training/1.architectures/5.sagemaker-hyperpod/automate-smhp-slurm/validate-config.py", line 193, in <module>
    main()
  File "/home/cloudshell-user/awsome-distributed-training/1.architectures/5.sagemaker-hyperpod/automate-smhp-slurm/validate-config.py", line 175, in main
    valid = validate_subnet(ec2_client, cluster_config) and valid
  File "/home/cloudshell-user/awsome-distributed-training/1.architectures/5.sagemaker-hyperpod/automate-smhp-slurm/validate-config.py", line 66, in validate_subnet
    response = ec2_client.describe_subnets(SubnetIds=[subnet_id])
  File "/usr/local/lib/python3.9/site-packages/botocore/client.py", line 569, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python3.9/site-packages/botocore/client.py", line 1023, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (InvalidSubnetID.NotFound) when calling the DescribeSubnets operation: The subnet ID 'subnet-0f3af7d4be4d8cb3c' does not exist
$ aws sagemaker create-cluster --cli-input-json file://cluster-config.json

An error occurred (ValidationException) when calling the CreateCluster operation: 1 validation error detected: Value 'ml.g7.2xlarge' at 'instanceGroups.2.member.instanceType' failed to satisfy constraint: Member must satisfy enum value set: [ml.r6i.16xlarge, ml.m6i.xlarge, ml.m5.4xlarge, ml.trn1.32xlarge, ml.m6i.12xlarge, ml.p5.48xlarge, ml.m6i.24xlarge, ml.p4d.24xlarge, ml.r6i.8xlarge, ml.r6i.large, ml.t3.xlarge, ml.trn2.48xlarge, ml.p5e.48xlarge, ml.m5.8xlarge, ml.m5.large, ml.g5.2xlarge, ml.m6i.16xlarge, ml.gr6.4xlarge, ml.g6.2xlarge, ml.g5.4xlarge, ml.g6.4xlarge, ml.c5.2xlarge, ml.c6i.32xlarge, ml.gr6.8xlarge, ml.c6i.xlarge, ml.g6e.xlarge, ml.c5.4xlarge, ml.g5.8xlarge, ml.c6i.12xlarge, ml.g6e.12xlarge, ml.g6.8xlarge, ml.c5n.18xlarge, ml.c6i.24xlarge, ml.g6e.24xlarge, ml.c6i.2xlarge, ml.g6e.48xlarge, ml.g6e.2xlarge, ml.c5.large, ml.c6i.16xlarge, ml.g6e.16xlarge, ml.c5.9xlarge, ml.c6i.4xlarge, ml.g6e.4xlarge, ml.c5.xlarge, ml.c5.12xlarge, ml.c5.24xlarge, ml.trn1n.32xlarge, ml.g6.xlarge, ml.c6i.8xlarge, ml.c6i.large, ml.g6e.8xlarge, ml.g6.12xlarge, ml.c5n.2xlarge, ml.g5.xlarge, ml.g6.24xlarge, ml.t3.2xlarge, ml.t3.medium, ml.g5.12xlarge, ml.c5n.4xlarge, ml.g5.24xlarge, ml.g6.48xlarge, ml.c5.18xlarge, ml.m6i.2xlarge, ml.p5en.48xlarge, ml.g6.16xlarge, ml.g5.48xlarge, ml.g5.16xlarge, ml.r6i.32xlarge, ml.m6i.4xlarge, ml.m5.xlarge, ml.c5n.large, ml.r6i.xlarge, ml.t3.large, ml.m5.12xlarge, ml.c5n.9xlarge, ml.r6i.12xlarge, ml.m5.24xlarge, ml.r6i.24xlarge, ml.r6i.2xlarge, ml.m6i.8xlarge, ml.m6i.large, ml.m5.2xlarge, ml.r6i.4xlarge, ml.m6i.32xlarge, ml.m5.16xlarge, ml.p4de.24xlarge]

サービスクォータの上限に達する場合

あくまでのコンフィグファイルのバリデーションのため、サービスクォータの上限に引っかかるかはチェックできませんでした。事前にサービスクォータのチェックをしておきましょう。

コマンド 結果
validate-config.py ❌ スルー
aws sagemaker create-cluster ✅エラー表示
$ python3 validate-config.py --cluster-config cluster-config.json --provisioning-parameters provisioning_parameters.json
✔️  Validated instance group name worker-group-1 is correct ...
✔️  Validated subnet subnet-0f3af7d4be4d8cb3c ...
✔️  Validated security group sg-0aabfa92fa251d1eb ingress rules ...
✔️  Validated security group sg-0aabfa92fa251d1eb egress rules ...
✔️  Validated FSx Lustre DNS name fs-0429c318db14542bd.fsx.us-east-1.amazonaws.com ...
✔️  Validated FSx Lustre mount name s4ryjb4v ...
✔️  Validated provisioning_parameter.json is valid json ...
✅ Cluster Validation succeeded
$ aws sagemaker create-cluster --cli-input-json file://cluster-config.json

An error occurred (ResourceLimitExceeded) when calling the CreateCluster operation: The account-level service limit 'ml.g5.2xlarge for cluster usage' is 0 Instances, with current utilization of 0 Instances and a request delta of 2 Instances. Please use AWS Service Quotas to request an increase for this quota. If AWS Service Quotas is not available, contact AWS support to request an increase for this quota.

同じ名前の HyperPod クラスターが存在している場合

コンフィグファイル内で指定しているクラスター名が、すでに存在しているかのチェックはありませんでした。

コマンド 結果
validate-config.py ❌ スルー
aws sagemaker create-cluster ✅ エラー表示
$ python3 validate-config.py --cluster-config cluster-config.json --provisioning-parameters provisioning_parameters.json
✔️  Validated instance group name worker-group-1 is correct ...
✔️  Validated subnet subnet-0f3af7d4be4d8cb3c ...
✔️  Validated security group sg-0aabfa92fa251d1eb ingress rules ...
✔️  Validated security group sg-0aabfa92fa251d1eb egress rules ...
✔️  Validated FSx Lustre DNS name fs-0429c318db14542bd.fsx.us-east-1.amazonaws.com ...
✔️  Validated FSx Lustre mount name s4ryjb4v ...
✔️  Validated provisioning_parameter.json is valid json ...
✅ Cluster Validation succeeded
$ aws sagemaker create-cluster --cluster-name mlcluster --cli-input-json file://cluster-config.json

An error occurred (ValidationException) when calling the CreateCluster operation: Cluster with name mlcluster already exists

まとめ

バリデーションスクリプトは、以下の項目を事前確認できます。

  • JSON フォーマットの構文チェック
  • サブネットやセキュリティグループの存在確認

一方で、AWS アカウント側の設定状況を加味した項目は確認できません。

  • サービスクォータの上限チェック
  • クラスター名の重複チェック

また、引数で渡す必要があるパラメーターファイルの作成にも手間がかかります。

おわりに

HyperPod クラスター作成時のバリデーションには制限がありますが、基本的な設定ミスを事前に発見できるスクリプトでした。何を検知できるのかは本記事で紹介したエラーケースが参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.